SQL Server - Acesso a Bases de dados
A conexão com o banco de dados envolve diversos componentes em diferentes níveis hierárquicos e seu uso e declaração segue uma metodologia de acesso.

1-Mecanismo(Engine) de Conexão com o Banco de dados

    Dependendo da fonte de dados devemos utilizar o mecanismo de acesso a fonte específico para a fonte de dados.

    Para o Microsoft Access o engine é o OLEDB :
        Imports System.Data.OleDb 'acesso ao access

    Para bases de dados não nativas da Microsoft existe um componente feito pelo fabricante que garante a conexão com o banco de dados.
        Para o Microsoft SQL Server é o sqlclient: Imports System.Data.SqlClient


2-Conexão

    Este tópico é um dos mais conturbados pois depende da fonte de dados para definir o tipo de conexão desejada bem como a string de conexão que contém os parâmetros de conexão para a fonte de dados desejada.

Toda a conexão tem os seguintes parâmetros:
    1.1-Servidor ou fonte de dados
    1.2-Base de dados
    1.3-Usuário
    1.4-Senha
    1.5-Tipo de autenticação: Integrada ( com Windows) ou não.
    Nota: Nem todos parâmetros acima são utilizados ao mesmo tempo em todos os tipos de conexão possíveis.

Para conectar via aplicações web com o ms sql server o string de conexão seria:
    cnstr = "Data Source = " + srvt + ";Initial Catalog=" + bdt + "; User ID=" + usut + "; Password=" + senhat

Para conectar a uma base de dados access teríamos o seguinte string de conexão:
    Dim cnstr As String = "Provider=Microsoft.Jet.Oledb.4.0;Data Source=pasta\arquivo.mdb"
    Note que no Access a segurança é obrigatoriamente integrada com o Windows e local.

Componentes de acesso aos dados


DataAdapter

DataAdapter é utilizado para obter as informações da fonte de dados e preencher um DataTable com os dados e constraints recebidos dentro do DataSet.
    Como o próprio nome diz, um adaptador entre os dois objetos.

•Armazena :
    •O objeto conexão de conexão com os dados.
    •O objeto comando com os comandos a serem enviados para a fonte de dados.
    •Trabalha em conjunto com o DataSet.
        •É utilizado para enviar as mudanças feitas no DataSet de volta para a fonte de dados.

• 'Traz' todos os registros de dados da fonte de dados para um 'buffer' em memória e por isso consegue manter a informação mesmo depois da conexão com a fonte de dados ter terminado.

•Simplesmente isola e faz uma ponte entre a fonte de dados do Dataset.

•Tem os seguintes comandos:
    SelectCommand
    InsertCommand
    DeleteCommand
    UpdateCommand

A diferença entre o DataAdapter e o DataReader é que o DataReader utiliza a conexão para conectar diretamente com o banco de dados sem a utilização do DataAdapter.


Data Reader

Para exibir o resultado de uma pesquisa feita num banco de dados, nada mais simples que usar os controles GridView e DataGridView. No entanto, onde esses controles devem ser utilizados é bem diferente.

GridView              é utilizado em ASP NET
DataGridView      é utilizado em Windows Forms

E as diferenças não param por aí.
•O GridView funciona com o DataReader mas o DataGridView não.
•Para exibir o resultado da pesquisa em Windows Forms deve-se utilizar o DataAdapter com o controle DataGridView.

Resumindo:
    aplicações web : GridView e DataReader.
    WINDOWS FORMS : DataGridView e e DataAdapter.

•Características DataReader :
    •1-Fechando a conexão, o DataReader é esvaziado.
    •2-O acesso aos dados do DataReader é Read-Only e forward-only.
    •3-Utilizando o DataReader a aplicação ganha em performance e reduz o consumo de recursos quando armazena todos os dados de uma vez.
    •4-O DataReader lê registro por registro do banco de dados, economiza recursos mas onera a rede e a conexão tem que ficar aberta durante toda a transferência.
    •5-Como o DataReader pode ler informações de diversas fontes de dados, ou seja, pode armazenar diversas 'DataTables' é por isso que associando um DataGridView diretamente nenhum dado é exibido porque o DataGridView não sabe de qual 'Data Table' deve exibir as informações.
    Portanto, antes de um DataReader popular um DataGridView ele tem que ser movido para um 'DataTable'

Utilizar o DataReader ou o DataSet? :
    Depende do processo.
    O DataReader é bom quando se faz poucos acessos, com poucos usuários e com poucos dados trocados entre o servidor e o cliente.
    Já se a pesquisa é feita com frequência e o número de usuários é maior, utilizar o DataSet.


Exemplo Windows.forms do preenchimento de um DataGridView com dados de uma tabela Access :
        Imports System.Data.OleDb        'Access

        Dim sql As String
        Dim dt As New DataTable

        sql = "select * from 001_Grupos"
        dr = RetornaDataReaderACCESS(sql)
        dt.Load(dr)        '(*1)
        DataGridView1.DataSource = dt
        DataGridView1.Refresh()

*1: O DataReader não pode ser associado diretamente a um GridView.
    Precisamos transferir os dados do DataReader para um DataTable e aí sim associar o DataTable ao GridView.

    Public Function RetornaDataReaderACCESS(ByVal sql As String) As OleDbDataReader
        Try
            Dim sqlcon = New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\xxx\yyy.MDB;Jet OLEDB:Database Password=senha;")    '<>
            sqlcon.Open()
            Dim comando = New OleDbCommand(sql, sqlcon)                        '<>
            Dim retornaQuery As OleDbDataReader = comando.ExecuteReader()
            Return retornaQuery
            'sqlcon.Close() se fechar a conexão antes do return perde os
dados

        Catch ex As Exception
            Throw ex
        End Try

    End Function



Exemplo web.foms do DataReader com o MS SQL executando uma querie qualquer:

    Imports System.Data.SqlClient    'Acesso ao MS SQL

    Public Function RetornaDataReaderMSSQL(ByVal sql As String) As SqlDataReader
        Try

            Dim sqlcon = New SqlConnection("Server=srv01; Database=DB_Controlexyz; UID=sa;PWD=xxx")
            Dim comando = New SqlCommand(sql, sqlcon)
            Dim retornaQuery As SqlDataReader = comando.ExecuteReader()
            sqlcon.Close()

            Return retornaQuery

        Catch ex As SqlException
            Throw ex
        End Try
    End Function



Exemplo do DataReader chamando um SP e populando um DataReader da maneira tradicional :
    'chamando uma sp modo tradicional
    Public Function ObtemAutor(ByVal IDAutor As String) As SqlDataReader
        Dim sql As String
        Dim sqlcon = New SqlConnection("Server=srv01; Database=DB_Controlexyz; UID=sa;PWD=xxx")
        sql = "select nome from tb_autores where id=" + IDAutor
        Dim command As SqlCommand = New SqlCommand(sql, sqlcon)
        command.CommandType = CommandType.StoredProcedure
        command.Parameters.Add(New SqlParameter("@IDAutor", IDAutor))
        command.Connection.Open()
        Return command.ExecuteReader(CommandBehavior.CloseConnection)
    End Function



Exemplo do DataReader chamando um SP e populando um DataReader da maneira simplificada:
    'chamando uma sp no modo simplificado
    Public Function ObtemAutor2(ByVal IDAutor As String) As SqlDataReader
        Dim sql As String
        Dim sqlcon = New SqlConnection("Server=srv01; Database=DB_Controlexyz; UID=sa;PWD=xxx")
        sql = "exec sp_pega_autor " + IDAutor
        Dim command As SqlCommand = New SqlCommand(sql, sqlcon)
        command.Connection.Open()
        Return command.ExecuteReader(CommandBehavior.CloseConnection)
    End Function